﻿#include <iostream>
using namespace std;

// 为什么基类的析构函数建议设计成虚函数
//class A
//{
//public:
//	virtual ~A()
//	{
//		cout << "~A()" << endl;
//	}
//};
//
//class B : public A
//{
//public:
//	 ~B()
//	{
//		cout << "~B()->delete" << _p << endl;
//		delete[] _p;
//	}
//protected:
//	int* _p = new int[10];
//};
//
//int main()
//{
//	A* p1 = new A;
//	A* p2 = new B;
//
//	delete p1;
//	delete p2;
//	return 0;
//}
//

//class A
//{
//public:
//	virtual void Print() const final
//	{
//		cout << "haha" << endl;
//	}
//	void test()
//	{
//		Print();
//	}
//};
//
//class B : public A
//{
//public:
//	virtual void Print() const
//	{
//		cout << "hehe" << endl;
//	}
//};
//
//int main()
//{
//	A* p = new B;
//	p->test();
//	return 0;
//}

// 纯虚函数和抽象类
//class Pumping_paper
//{
//public:
//	virtual void using_feel() = 0;
//	void Test()
//	{
//		using_feel();
//	}
//};
//
//class ManHua : public Pumping_paper
//{
//public:
//	 void using_feel() 
//	{
//		cout << "蓬松" << endl;
//	}
//};
//
//class QingFeng : public Pumping_paper
//{
//public:
//	 void using_feel() 
//	{
//		cout << "柔软" << endl;
//	}
//};
//
//int main()
//{
//	Pumping_paper* p1 = new ManHua;
//	Pumping_paper* p2 = new QingFeng;
//	p1->Test();
//	p2->Test();
//	delete p1;
//	delete p2;
//	return 0;
//}

/*下⾯编译为32位程序的运⾏结果是什么（）
A.编译报错  B.运⾏报错  C.8  D.12*/
//class A
//{
//public:
//	virtual void Func()
//	{
//		//...
//	}
//protected:
//	int _a = 1;
//	char _b;
//};
//
//int main()
//{
//	A a1;
//	cout << sizeof(a1) << endl;
//	return 0;
//}

//class Person
//{
//public:
//	virtual void Print()
//	{
//		cout << "全价" << endl;
//	}
//
//	virtual void Func()
//	{
//		//...
//	}
//
//	void Test()
//	{
//		Print();
//	}
//
//protected:
//	string _name = "欧阳";
//};
//
//class Student : public Person
//{
//public:
//	virtual void Print()
//	{
//		cout << "打折" << endl;
//	}
//	virtual void Func_S()
//	{
//		//...
//	}
//protected:
//	int _id = 1;
//};
//
//class Child : public Person
//{
//public:
//	virtual void Print()
//	{
//		cout << "免费" << endl;
//	}
//protected:
//	int _age = 6;
//};
//
//int main()
//{
//	Person* p1 = new Person;
//	Person* p2 = new Student;
//	Person* p3= new Child;
//
//	p1->Test();
//	p2->Test();
//	p3->Test();
//
//	delete p1;
//	delete p2;
//	return 0;
//}

//class Person {
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//};
//
//class Student : public Person {
//public:
//	virtual void BuyTicket() { cout << "买票-打折" << endl; }
//};
//
//class Soldier : public Person {
//public:
//	virtual void BuyTicket() { cout << "买票-优先" << endl; }
//};
//
//void Func(Person* ptr)
//{
//	// 这⾥可以看到虽然都是Person指针Ptr在调⽤BuyTicket
//	// 但是跟ptr没关系，⽽是由ptr指向的对象决定的。
//	ptr->BuyTicket();
//} 
//
//int main()
//{
//	// 其次多态不仅仅发⽣在派⽣类对象之间，多个派⽣类继承基类，重写虚函数后
//	// 多态也会发⽣在多个派⽣类之间。
//	Person ps;
//	Student st;
//	Soldier sr;
//	Func(&ps);
//	Func(&st);
//	Func(&sr);
//	return 0;
//}

class Base {
public:
	virtual void func1() { cout << "Base::func1" << endl; }
	virtual void func2() { cout << "Base::func2" << endl; }
	void func5() { cout << "Base::func5" << endl; }
protected:
	int a = 1;
};

class Derive : public Base
{
public :
	// 重写基类的func1
	virtual void func1() { cout << "Derive::func1" << endl; }
	virtual void func3() { cout << "Derive::func1" << endl; }
	void func4() { cout << "Derive::func4" << endl; }
protected:
	int b = 2;
};

int main()
{
	int i = 0;
	static int j = 1;
	int* p1 = new int;
	const char* p2 = "xxxxxxxx";
	printf("栈:%p\n", &i);
	printf("静态区:%p\n", &j);
	printf("堆:%p\n", p1);
	printf("常量区:%p\n", p2);
	Base b;
	Derive d;
	Base* p3 = &b;
	Derive* p4 = &d;
	printf("Person虚表地址:%p\n", *(int*)p3);
	printf("Student虚表地址:%p\n", *(int*)p4);
	printf("虚函数地址:%p\n", &Base::func1);
	printf("普通函数地址:%p\n", &Base::func5);
	return 0;
}
